home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
telecomm
/
sticpsrc.lzh
/
SOURCE.ARC
/
AX25CMD.C
< prev
next >
Wrap
C/C++ Source or Header
|
1990-08-12
|
22KB
|
1,004 lines
#include <stdio.h>
#include "global.h"
#include "mbuf.h"
#include "ax25.h"
#include "timer.h"
#include "iface.h"
#include "lapb.h"
#include "cmdparse.h"
#include "session.h"
char *ax25states[] = {
"Disconnected",
"Conn pending",
"Disc pending",
"Connected",
"Frame Reject"
};
char *ax25mesgs[] = {
"",
"CONNECTED to",
"DISCONNECTED from",
"BUSY from",
"LINK FAILURE with",
"LINK RESET from",
"LINK RESET to",
"FRAME REJECT from",
"FRAME REJECT to",
};
char badcall[] = "Bad callsign %s\n";
char baddigi[] = "Bad digi callsign %s\n";
char notax25[] = "Interface %s not AX.25 type\n";
static char all_ax[] = "ALL AX.25";
static char conn[] = "conn";
static char digi[] = "digi";
static char gate[] = "gate";
static char on[] = "on";
static char off[] = "off";
static char stop[] = "stop";
extern char nospace[];
static int doaxport(),dodigipeat(),doaxstat(),dot1(),dot2(),dot3(),dot4(),
doexclude(),dopthresh(),domaxframe(),doaxwindow(),dopaclen(),don2(),
doaxclose(),doaxdisc(),doaxreset(),doaxkick(),doaxbreak(),domaxsamml();
int dopersist();
int doaxstart(),doaxstop();
static struct cmds axcmds[] = {
#ifdef AX25BREAK
"break", doaxbreak, 4, "<iface> <call1> <call2> [<digi>]", NULLCHAR,
#endif
"close", doaxclose, 2, "<axcb>", NULLCHAR,
"digipeat", dodigipeat, 0, NULLCHAR, NULLCHAR,
"disconnect", doaxdisc, 2, "<axcb>", NULLCHAR,
"exclude", doexclude, 0, NULLCHAR, NULLCHAR,
"kick", doaxkick, 2, "<axcb>", NULLCHAR,
"maxframe", domaxframe, 0, NULLCHAR, NULLCHAR,
"maxsammler", domaxsamml, 0, NULLCHAR, NULLCHAR,
"paclen", dopaclen, 0, NULLCHAR, NULLCHAR,
"persist", dopersist, 0, NULLCHAR, NULLCHAR,
"port", doaxport, 0, NULLCHAR, "Couldn't set port",
"pthresh", dopthresh, 0, NULLCHAR, NULLCHAR,
"reset", doaxreset, 2, "<axcb>", NULLCHAR,
"retry", don2, 0, NULLCHAR, NULLCHAR,
"status", doaxstat, 0, NULLCHAR, NULLCHAR,
"start", doaxstart, 2, "<servername>",NULLCHAR,
"stop", doaxstop, 2, "<servername>", NULLCHAR,
"t1", dot1, 0, NULLCHAR, NULLCHAR,
"t2", dot2, 0, NULLCHAR, NULLCHAR,
"t3", dot3, 0, NULLCHAR, NULLCHAR,
"t4", dot4, 0, NULLCHAR, NULLCHAR,
"window", doaxwindow, 0, NULLCHAR, NULLCHAR,
NULLCHAR, NULLFP, 0, "?subcommands", NULLCHAR
};
/* Multiplexer for top-level ax25 command */
doax25(argc,argv)
int argc;
char *argv[];
{
return subcmd(axcmds,argc,argv);
}
/* Reset an AX.25 session */
static
doaxreset(argc,argv)
int argc;
char *argv[];
{
struct ax25_cb *axp;
extern char notval[];
axp = (struct ax25_cb *)long2ptr(htol(argv[1]));
if(!ax25val(axp)){
printf(notval);
return 1;
}
reset_ax25(axp);
return 0;
}
/* Close an AX.25 session (= graceful disconnect) */
static
doaxclose(argc,argv)
int argc;
char *argv[];
{
struct ax25_cb *axp;
void close_ax25();
extern char notval[];
axp = (struct ax25_cb *)long2ptr(htol(argv[1]));
if(!ax25val(axp)){
printf(notval);
return 1;
}
close_ax25(axp);
return 0;
}
/* Disconnect an AX.25 session */
static
doaxdisc(argc,argv)
int argc;
char *argv[];
{
struct ax25_cb *axp;
void disc_ax25();
extern char notval[];
axp = (struct ax25_cb *)long2ptr(htol(argv[1]));
if(!ax25val(axp)){
printf(notval);
return 1;
}
disc_ax25(axp);
return 0;
}
#ifdef AX25BREAK
/* Breakdown an AX.25 connection */
/* This really anti-social function was only implemented to stop BBS */
/* systems from forwarding huge amounts of mail using AX.25 when the */
/* channel already is very busy. Probably can be removed soon (??) */
static int
doaxbreak(argc,argv)
int argc;
char *argv[];
{
struct ax25_cb axcb;
extern char nospace[];
memset(&axcb,0,sizeof(struct ax25_cb));
if((axcb.interface = ifunit(argv[1])) == NULLIF)
return 1;
if(!(axcb.interface->flags & IF_AX25)){
printf(notax25,argv[1]);
return 1;
}
if(setcall(&axcb.addr.source,argv[2]) < 0){
printf(badcall,argv[2]);
return 1;
}
if(setcall(&axcb.addr.dest,argv[3]) < 0){
printf(badcall,argv[3]);
return 1;
}
axcb.addr.ndigis = 0;
if(argc > 4){
if(setcall(&axcb.addr.digis[0],argv[4]) < 0){
printf(baddigi,argv[4]);
return 1;
}
axcb.addr.ndigis = 1;
}
sendctl(&axcb,COMMAND,DISC|PF);
sendctl(&axcb,RESPONSE,DM|PF);
setcall(&axcb.addr.source,argv[3]);
setcall(&axcb.addr.dest,argv[2]);
sendctl(&axcb,COMMAND,DISC|PF);
sendctl(&axcb,RESPONSE,DM|PF);
stop_timer(&axcb.t1);
return 0;
}
#endif
/* Display AX.25 link level control blocks */
static
doaxstat(argc,argv)
int argc;
char *argv[];
{
register int i;
register struct ax25_cb *axp;
char tmps[10],tmpd[10];
extern char notval[];
if(argc < 2){
printf(" &AXB IF Rcv-Q Snd-Q Local Remote State\n");
for(i=0;i<NHASH;i++){
for(axp = ax25_cb[i];axp != NULLAX25; axp = axp->next){
pax25(tmps,&axp->addr.source);
pax25(tmpd,&axp->addr.dest);
printf("%8lx %-6s%5d%8d %-10s%-10s%s\n",
ptr2long(axp),axp->interface->name,
len_mbuf(axp->rxq),len_q(axp->txq),
tmps,tmpd,ax25states[axp->state]);
}
}
return 0;
}
axp = (struct ax25_cb *)long2ptr(htol(argv[1]));
if(!ax25val(axp)){
printf(notval);
return 1;
}
dumpstat(axp);
return 0;
}
/* Dump one control block */
static
dumpstat(axp)
register struct ax25_cb *axp;
{
char tmps[10],tmp[10];
int i;
if(axp == NULLAX25 || axp->interface == NULLIF)
return;
printf(" &AXB IF Local Remote RBWF V(S) V(R) Unack P Retry State\n");
pax25(tmps,&axp->addr.source);
pax25(tmp,&axp->addr.dest);
printf("%8lx %-5s%-10s%-10s",ptr2long(axp),axp->interface->name,tmps,tmp);
putchar(axp->rejsent ? 'R' : ' ');
putchar(axp->remotebusy ? 'B' : ' ');
putchar(axp->waitack ? 'W' : ' ');
putchar(axp->fin ? 'F' : ' ');
printf(" %4d %4d",axp->vs,axp->vr);
printf(" %u/%u/%u %u",axp->unack,axp->sent,axp->maxframe,axp->proto);
printf(" %02u/%02u",axp->retries,axp->n2);
printf(" %s\n",ax25states[axp->state]);
printf("T1: ");
if(run_timer(&axp->t1))
printf("%lu",TICK2MS(axp->t1.start - axp->t1.count));
else
printf(stop);
printf("/%lu ms; ",TICK2MS(axp->t1.start));
printf("T2: ");
if(run_timer(&axp->t2))
printf("%lu",TICK2MS(axp->t2.start - axp->t2.count));
else
printf(stop);
printf("/%lu ms; ",TICK2MS(axp->t2.start));
printf("T3: ");
if(run_timer(&axp->t3))
printf("%lu",TICK2MS(axp->t3.start - axp->t3.count));
else
printf(stop);
printf("/%lu ms; ",TICK2MS(axp->t3.start));
printf("T4: ");
if(run_timer(&axp->t4))
printf("%lu",TICK2MS(axp->t4.start - axp->t4.count));
else
printf(stop);
printf("/%lu ms",TICK2MS(axp->t4.start));
for(i = 0; i < 8; i++)
if(axp->sammlq[i] != NULLBUF){
printf("\nFramesammler: %d",i++);
for(; i < 8; i++)
if(axp->sammlq[i] != NULLBUF)
printf(" %d",i);
printf(" (max %d)",axp->maxsamml);
}
if(axp->addr.ndigis != 0){
printf("\nDigipeaters:");
for(i=0;i<axp->addr.ndigis;i++){
pax25(tmp,&axp->addr.digis[i]);
printf(" %s",tmp);
}
}
printf("\n");
}
/* Display or change our AX.25 ports
* usage:
* ax25 port <portnumber> conn|digi <callsign> [<interface> [gate|multi]]
* ax25 port
*/
static
doaxport(argc,argv)
int argc;
char *argv[];
{
register struct ax25_call *axc;
struct ax25_call **which;
struct interface *ifp = NULLIF;
struct ax25_addr mycall;
char tmp[10];
int port;
void ax_noserv();
if(argc < 2){
printf("port# Callsign Interface Mode MG Started\n");
if((axc = ax25_port) != NULLAXCALL)
while(axc->p_next != NULLAXCALL)
axc = axc->p_next;
while(axc != NULLAXCALL){
pax25(tmp,&axc->addr);
printf("%4d %-10s %-10s %-6s%c%c ",axc->port,tmp,
(axc->interface == NULLIF?
all_ax:axc->interface->name),
(axc->mode == CONNECT? conn:digi),
(axc->flags & MULTI_IF? 'M':' '),
(axc->flags & DIGIGATEWAY? 'G':' '));
if(axc->s_upcall == ax_noserv)
printf("no\n");
else
printf("yes\n");
axc = axc->p_prev;
}
return 0;
}
if(argc < 4){
pr